/* Copyright (c) Stanford University, The Regents of the University of
 *               California, and others.
 *
 * All Rights Reserved.
 *
 * See Copyright-SimVascular.txt for additional details.
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject
 * to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/*
 * CVPYTHONMacros.h
 *
 *  Created on: Apr 8, 2014
 *      Author: jameson
 */

#ifndef CVPYTHONMACROS_H_
#define CVPYTHONMACROS_H_															\

#define CVPYTHONRepositoryExistsMacro(obj,PyRunTimeErr) 										\
		if ( gRepository->Exists( obj ) ) {                                         \
            char temp[2048];                                                        \
			PyErr_SetString(PyRunTimeErr, "object already exists"); 											\
		}																		\

#define CVPYTHONRepositoryRegisterMacro(objName,obj,PyRunTimeErr) 								\
		if ( !(gRepository->Register( objName, obj )) ) { 						\
			PyErr_SetString(PyRunTimeErr, "error registering obj in repository");\
					delete obj; 												\
		} 																		\
																	\

#define CXX_PYTHON_STDARGS PyObject *self, PyObject *args

#define CVPYTHONMtdDeclareMacro(objname,name) 										\
		static PyObject* objname##_##name##Mtd( CXX_PYTHON_STDARGS )						\

#define CVPYTHONObjMemberSetPropertyMacro(pythonName,objname,property,type,cv_type,PyRunTimeErr) 	\
		CVPYTHONMtdDeclareMacro(pythonName,Set##property) 							\
		{																		\
			objname *ls; 								\
			type input; 														\
            if(!PyArg_ParseTuple(args,cv_type,&input))                          \
            {                                                                   \
                PyErr_SetString(PyRunTimeErr, "Could not import cv_type");      \
            }																	 \
			ls->Set##property(input); 											\
		    return SV_PYTHON_OK;	\
		}																		\


#define CVPYTHONObjMemberGetObjPropertyMacro(pythonName,objname,property,type,PyRunTimeErr) 		\
		CVPYTHONMtdDeclareMacro(pythonName,Get##property) 							\
		{																		\
			objname *ls; 								                        \
			type* cvObj;														\
			char * objName;														\
            if(!PyArg_ParseTuple(args,"s",&objName))                            \
            {                                                                   \
                PyErr_SetString(PyRunTimeErr, "Could not import cv_type");      \
            }																	\
			cvObj = ls->Get##property (); 										\
			if ( cvObj == NULL ) { 												\
				PyErr_SetString(PyRunTimeErr, "error, obj is null" ); 		    \
			}																	\
			CVPYTHONRepositoryRegisterMacro(objName,cvObj,PyRunTimeErr);						\
			return Py_BuildValue("s",cvObj->GetName());							\
		}																		\




#endif /* CVITKMACROS_H_ */


